/**
 * 观察者
 * 监听DOM，观察数据变化后执行响应的方法.
 * 比较新旧值，不一样就行方法
 */
class  Watcher {
    constructor(vm, expr, cb) {
        this.vm =  vm;
        this.expr = expr;
        this.cb = cb;
        // 获取旧值
        this.value = this.get();
    }

    getVal(vm, expr) {
        const exprArr = expr.split('.')
        return  exprArr.reduce((pre, next) => {
            return pre[next];
        }, vm.$data);
    }

    get() {
        Dep.target = this;
        const value = this.getVal(this.vm, this.expr);
        Dep.target = null; // 初始化watcher后需要将target置为空。（get方法就会调用一次，在模板编译阶段，初始化的时候调用。）
        return value;
    }

    update() {
        let newValue = this.getVal(this.vm, this.expr);
        let oldValue = this.value;
        if (newValue !== oldValue) {
            this.cb(newValue);
        }
    }
}